package com.tree.backend.utils;

/**
 * 用户上下文工具类
 * 使用ThreadLocal存储当前线程的用户信息
 */
public class UserContext {
    // 使用ThreadLocal存储用户名
    private static final ThreadLocal<String> usernameHolder = new ThreadLocal<>();
    
    // 使用ThreadLocal存储用户ID
    private static final ThreadLocal<Long> userIdHolder = new ThreadLocal<>();
    
    // 使用ThreadLocal存储用户类型
    private static final ThreadLocal<Integer> userTypeHolder = new ThreadLocal<>();
    
    // 使用ThreadLocal存储企业ID
    private static final ThreadLocal<Long> enterpriseIdHolder = new ThreadLocal<>();
    
    /**
     * 设置当前线程的用户名
     * @param username 用户名
     */
    public static void setUsername(String username) {
        usernameHolder.set(username);
    }
    
    /**
     * 获取当前线程的用户名
     * @return 当前用户名
     */
    public static String getUsername() {
        return usernameHolder.get();
    }
    
    /**
     * 设置当前线程的用户ID
     * @param userId 用户ID
     */
    public static void setCurrentUserId(Long userId) {
        userIdHolder.set(userId);
    }
    
    /**
     * 获取当前线程的用户ID
     * @return 当前用户ID
     */
    public static Long getCurrentUserId() {
        return userIdHolder.get();
    }
    
    /**
     * 设置当前线程的企业ID
     * @param enterpriseId 企业ID
     */
    public static void setCurrentUserEnterpriseId(Long enterpriseId) {
        enterpriseIdHolder.set(enterpriseId);
    }
    
    /**
     * 获取当前线程的企业ID
     * @return 当前企业ID
     */
    public static Long getCurrentUserEnterpriseId() {
        return enterpriseIdHolder.get();
    }
    
    /**
     * 设置当前线程的用户类型
     * @param userType 用户类型
     */
    public static void setCurrentUserType(Integer userType) {
        userTypeHolder.set(userType);
    }
    
    /**
     * 获取当前线程的用户类型
     * @return 当前用户类型
     */
    public static Integer getCurrentUserType() {
        return userTypeHolder.get();
    }
    
    /**
     * 清除当前线程的用户信息
     * 在请求结束时调用，防止内存泄漏
     */
    public static void clear() {
        usernameHolder.remove();
        userIdHolder.remove();
        userTypeHolder.remove();
        enterpriseIdHolder.remove();
    }
}